Explicar cuando se produce un fast-forward y cual es el comportamiento de las ramas en esta situación
Partimos de un escenario en el que tenemos un 2 ramas, una rama main y una rama ram3, las dos apuntan al mismo commit:
Despues avanzamos la rama ram3 con un nuevo commit:
En esta situación la rama ram3 es igual que la rama main pero con cambios añadidos a mayores, y la rama main no añade ningún cambio, en está situación si nos ponemos en main y mergeamos la rama ram3 se producirá un fast-forward, esto quiere decir que las dos ramas apuntarán al mismo commit, 1a3940d en este caso, y no se producira un nuevo commit como proudcto del merge:
Si queremos forzar la generación de un nuevo commit podemos usar la opcion --no-ff:
git merge --no-ff ram3
Como vemos en este caso se ha utilizado la estrategia de merge recursive en vez de fast-forward y se ha generado un nuevo commit a partir de main y ram3.
Como curiosidad este nuevo commit generado por el merge es identico al commit de la rama ram3, por eso cuando hacemos el merge de manera normal se produce el fast-forward y las dos ramas apuntan al mismo sitio, porque son exactamente iguales.
Una situación curiosa que se produce en esta situación es que si se intenta hacer un revert del commit del merge, y se elige el mainline de la rama ram3 el revert nos dice que no tendrá efecto ya que las dos ramas son iguales:
Git | Merge | fast-forward